package br.com.devteam.sgap.view.externo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.devteam.base.util.Message;
import br.com.devteam.base.util.SGAPContantes;
import br.com.devteam.sgap.model.Perfil;
import br.com.devteam.sgap.model.Usuario;
import br.com.devteam.sgap.service.IService;

@Controller(value = "mBeanCadastroAluno")
@Scope(value = "session")
@ManagedBean
public class MBeanCadastroAluno {

	@Autowired
	private IService service;

	private Usuario usuario;
	private String confirmaSenha;
	private Perfil perfil;
	private String email;

	private List<Usuario> usuarios;

	private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
			+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

	public MBeanCadastroAluno() {
	}

	public String actionSalvar() {
		if (validar()) {
			try {
				perfil = new Perfil();
				perfil.setPerfil(Perfil.PERFIL_ALUNO);				
				perfil.setUsuario(usuario);
				perfil.setLogin(usuario.getLogin());

				usuario.setPerfis(new ArrayList<Perfil>());
				usuario.getPerfis().add(perfil);
				
				usuario.setEnable(true);

				service.save(usuario);
				Message.i(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ENTRY_SAVE);
				Message.manterMensagensRedirect();
				
				usuario = null;
				perfil = null;
				confirmaSenha = "";
				email = "";
				usuarios.clear();

				return SGAPContantes.PAGE_CADASTRO_SUCSSO;
			} catch (Exception e) {
				e.printStackTrace();
				Message.e(SGAPContantes.MESSAGE_FIELD,
						SGAPContantes.ERROR_GENERIC);
			}
		}
		return "";
	}

	public String actionCancelar() {
		usuario = null;
		perfil = null;
		confirmaSenha = "";
		email = "";
		usuarios = new ArrayList<Usuario>();
		return SGAPContantes.PAGE_LOGIN;
	}

	private boolean validar() {
		boolean retorno = true;
		
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("login", usuario.getLogin());
		List<Usuario> usuarios = service.findByNamedQuery(Usuario.QUERY_LIST_BY_LOGIN, params);
		
		Map<String, Object> paramsEmail = new HashMap<String, Object>();
		paramsEmail.put("email", usuario.getEmail());
		List<Usuario> users = service.findByNamedQuery(Usuario.QUERY_EMAIL, paramsEmail);
		
		if (users.size() > 0) {
			if (usuario.getEmail().equals(users.get(0).getEmail())) {
				retorno = false;
				Message.e("email", SGAPContantes.ERROR_FORM_FIELD_EMAIL);
			}
		}
		
		if (usuario.getNome() == null || usuario.getNome().length() < 1) {
			retorno = false;
			Message.e("nome", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}
		
		if (!usuario.getEmail().matches(EMAIL_PATTERN)) {
			retorno = false;
			Message.e("email", "E-mail inválido");
		}
		
		if (usuario.getLogin() == null || usuario.getLogin().length() < 1) {
			retorno = false;
			Message.e("login", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		} 
			if (!usuarios.isEmpty()) {
				if (usuarios.get(0).getId() != usuario.getId()) {
					retorno = false;
					Message.e("login", "Este login já está sendo usado por outro usuário, por favor, escolher outro");
				}
			}
		
		if (usuario.getSenha() == null || usuario.getSenha().length() < 1) {
				retorno = false;
				Message.e("senha", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}
		
		if (confirmaSenha == null || confirmaSenha.length() < 1) {
				retorno = false;
				Message.e("confirmaSenha", SGAPContantes.ERROR_EMPTY_TEXT_FIELD);
		}
	
		if (!confirmaSenha.equals(usuario.getSenha())) {
			retorno =  false;
			Message.e("confirmaSenha", "Senha incorreta");
		} 

		if (usuario.getSenha().equals("") || confirmaSenha.equals("")) {
			if (!usuario.getSenha().equals(confirmaSenha)) {
				retorno =  false;
				Message.e("confirmaSenha", "Senhas diferentes");
			}
			retorno =  false;
			Message.e("confirmaSenha", "Senhas em branco");
			Message.e("senha", "Senhas em branco");
		}
		
		if (!retorno) {
			Message.e(SGAPContantes.MESSAGE_FIELD, SGAPContantes.ERROR_GENERIC);
		}
		
		return retorno;
	}

	public Usuario getUsuario() {
		if (usuario == null)
			usuario = new Usuario();

		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getConfirmaSenha() {
		return confirmaSenha;
	}

	public void setConfirmaSenha(String confirmaSenha) {
		this.confirmaSenha = confirmaSenha;
	}

	public Perfil getPerfil() {
		if (perfil == null)
			perfil = new Perfil();

		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

}
